/* eslint-disable */
/*
 * @Description: 文件管理 上传，下载 ，文件流互转
 * @Author:
 * @Date:
 * @LastEditors: dh
 */

/**
 * base64、File、Blob、ArrayBuffer互转【收藏备用】 https://mp.weixin.qq.com/s/0VLRH97CCO4_-ckbL6s6zg
 */

/**
 * 下载文件
 * @param data 二进制文件流
 * @param filename 文件名字
 * @param type 文件类型
 *  */
export function downLoadFile(data, filename, type = "pdf") {
	// mime 类型 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
	// var blob = new Blob([data], {type: 'application/vnd.ms-excel'})//接收的是blob，若接收的是文件流，需要转化一下
	// 如果blob对象有type，可以不加type
	// var blob = new Blob([data], { type: "application/vnd.ms-excel" });
	let blob = new Blob([data]);
	if (typeof window.chrome !== "undefined") {
		// Chrome version
		let link = document.createElement("a");
		var url = window.URL.createObjectURL(blob); // ie9支持 用于创建 URL 的 File 对象、Blob 对象或者 MediaSource 对象。
		link.href = url;
		link.download = filename + "." + type;
		link.click();
		window.URL.revokeObjectURL(url); // 释放
	} else if (typeof window.navigator.msSaveBlob !== "undefined") {
		// IE version
		blob = new Blob([data], { type: "application/force-download" });
		window.navigator.msSaveBlob(blob, filename + "." + type);
	} else {
		// Firefox version
		let file = new File([data], filename + "." + type, {
			type: "application/force-download",
		});
		var url = window.URL.createObjectURL(file);
		window.open(url);
		window.URL.revokeObjectURL(url); // 释放
	}
}
/* TODO https://juejin.cn/post/7156427561302982670
 * 一般来说前端实现的思路就是通过动态创建a标签，设置其download属性，最后删除a就好了，对于不是图片的文件一般都可以下载，
 * 但是如果是 图片 视频 等媒体文件 或者 跨域的文件，有些浏览器会自动打开图片，所以我们需要手动把它转化为data:URLs或blob:URLs，
 * 基于这个原理，我们可以用fileReader，也可以用fetch-URL.createObjectURL，这里经过大量测试我采用后者：
 */
function download(url, filename) {
	return fetch(url).then(res =>
		res.blob().then(blob => {
			const a = document.createElement("a");
			const url = window.URL.createObjectURL(blob);
			a.href = url;
			a.download = filename;
			a.click();
			window.URL.revokeObjectURL(url);
		})
	);


	// 下面的没试过，第三参数和a标签的download属性一样
	// window.open('http://www.baidu.com', '_blank', 'download=baidu.html')
}

/**
 * 下载json
 * @param {string} url
 * @param {string} name
 * @returns {number} number
 *  */
function json2file(url, name) {
	const a = document.createElement("a");
	a.download = name;
	a.rel = "noopener";
	a.href = url;
	// 触发模拟点击
	a.dispatchEvent(new MouseEvent("click"));
	// 或者 a.click()
}

const json = {
	a: 3,
	b: 4,
	c: 5,
};
const str = JSON.stringify(json, null, 2);

// 方案一：Text -> DataURL
const dataUrl = `data:,${str}`;
// json2file(dataUrl, "demo.json");

// 方案二：Text -> Blob -> ObjectURL
const url = URL.createObjectURL(new Blob(str.split("")));
// json2file(url, "demo1.json");

/**
 * 根据url地址下载 图片链接会直接打开
 */
export const downloadURL = url => {
	let isChrome = navigator.userAgent.toLowerCase().indexOf("chrome") > -1;
	let isSafari = navigator.userAgent.toLowerCase().indexOf("safari") > -1;
	if (isChrome || isSafari) {
		let link = document.createElement("a");
		link.href = url;
		if (link.download !== undefined) {
			let fileName = url.substring(url.lastIndexOf("/") + 1, url.length);
			link.download = fileName;
		}
		if (document.createEvent) {
			let e = document.createEvent("MouseEvents");
			e.initEvent("click", true, true);
			link.dispatchEvent(e);
			return true;
		}
	}
	if (url.indexOf("?") === -1) {
		url += "?download";
	}
	window.open(url, "_self");
	return true;
};

/**
 * 原生上传文件
 */
export function uploadFile() {
	let input = document.createElement("input");
	input.type = "file";
	input.click();
	input.onchange = function () {
		let file = input.files[0];
		// file = new File([file], '11111111111' + '.' + file.name.split('.')[1], { type: file.type });//此处可以修改上传文件名
		let form = new FormData();
		form.append("file", file); // 第一个参数是后台读取的请求key值
		form.append("other", "666666"); // 实际业务的其他请求参数
		let xhr = new XMLHttpRequest();
		let action = "/upLoadFile"; // 上传服务的接口地址
		xhr.open("POST", action);
		xhr.send(form); // 发送表单数据
		xhr.onreadystatechange = function () {
			if (xhr.readyState == 4 && xhr.status == 200) {
				let resultObj = JSON.parse(xhr.responseText);
				console.log(resultObj);
				// 处理返回的数据......
			}
		};
	};
}

/**
 * 转 base64url data可以是file和blob
 */
export function data2base64(data) {
	let reader = new FileReader(); // ie 10 11仅部分支持
	reader.readAsDataURL(data);
	reader.onload = function () {
		return reader.result; // 获取到base64格式
	};
}

/**
 * file 对象转 base64url
 */
export function file2base64(file) {
	const reader = new FileReader();
	reader.readAsDataURL(file[0]);
	return reader;
}

/**
 *  base64url 转成blob 上传
 */
export function base642blob(dataURI) {
	let byteString = atob(dataURI.split(",")[1]);
	let mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0];
	let ab = new ArrayBuffer(byteString.length);
	let ia = new Uint8Array(ab);
	for (let i = 0; i < byteString.length; i++) {
		ia[i] = byteString.charCodeAt(i);
	}
	return new Blob([ab], { type: mimeString });
}

/**
 *  blob 转成ArrayBuffer
 */
export function blob2ArrayBuffer(d) {
	const blob = new Blob([1, 2, 3, 4]);
	const reader = new FileReader();
	reader.onload = function (result) {
		console.log(result);
	};
	reader.readAsArrayBuffer(blob);
}

/**
 *  buffer 转成blob
 */
export function buffer2blob() {
	const blob = new Blob([buffer]);
}

/**
 *  base64url 转 file
 */
export function base642file(urlData, filename) {
	// 64转file
	if (typeof urlData !== "string") {
		this.$toast("urlData不是字符串");
		return;
	}
	let arr = urlData.split(",");
	let type = arr[0].match(/:(.*?);/)[1];
	let fileExt = type.split("/")[1];
	let bstr = atob(arr[1]);
	let n = bstr.length;
	let u8arr = new Uint8Array(n);
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n);
	}
	return new File([u8arr], "filename." + fileExt, {
		type: type,
	});
}

/**
 * 获取文件后缀名
 * @param {String} filename
 */
export function getExt(filename) {
	if (typeof filename === "string") {
		return filename.split(".").pop().toLowerCase();
	} else {
		throw new Error("filename must be a string type");
	}
}
